package com.gitee.srurl.snow.domain;

/**
 * 雪花算法常量
 *
 * @author zxw
 * @date 2023/4/22 10:52
 */
public interface SnowflakeConstant {

    /**
     * 默认的起始时间，为Thu, 04 Nov 2010 01:42:54 GMT
     */
    long DEFAULT_TWEPOCH = 1288834974657L;
    /**
     * 默认回拨时间，2S ==> 5分钟
     */
    long DEFAULT_TIME_OFFSET = 1000 * 60 * 5;

    long WORKER_ID_BITS = 5L;

    /**
     * 最大支持机器节点数0~31，一共32个
     * 如果使用{@link com.gitee.srurl.snow.backwards.BorrowFutureTime} 处理时钟回拨
     * 则ID范围只能为 0~15
     */
    @SuppressWarnings({"PointlessBitwiseExpression", "FieldCanBeLocal"})
    long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS);
    long DATA_CENTER_ID_BITS = 5L;

    /**
     * 最大支持数据中心节点数0~31，一共32个
     */
    @SuppressWarnings({"PointlessBitwiseExpression", "FieldCanBeLocal"})
    long MAX_DATA_CENTER_ID = -1L ^ (-1L << DATA_CENTER_ID_BITS);

    /**
     * 序列号12位（表示只允许id的范围为：0-4095）
     */
    long SEQUENCE_BITS = 12L;

    /**
     * 机器节点左移12位
     */
    long WORKER_ID_SHIFT = SEQUENCE_BITS;

    /**
     * 数据中心节点左移17位
     */
    long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;

    /**
     * 时间毫秒数左移22位
     */
    long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;

    /**
     * 序列掩码，用于限定序列最大值不能超过4095
     */
    long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS);
}
